<

AnnotatedRegionLayers はクリッピング領域を基準としたローカル位置を返します

まとめ

によって返されるローカル位置AnnotatedRegionLayersで 注釈の検索がクリッピングに相対するように変更されました。 レイヤーの代わりに領域を指定します。これにより、局所的な位置がさらに高くなります 意味があり信頼性がありますが、直接実行するコードは壊れます アノテーションはローカル位置を検索して使用します。

コンテクスト

注釈は、 画面上の領域へのレンダリング フェーズ。 位置を指定して注釈を検索すると、 その場所を含むコンテキスト情報。 これらは、マウス イベントとアプリ バーのテーマを検出するために使用されます。

いつlocalPosition最初に検索結果に追加されましたが、 アノテーションを所有するレイヤーを基準として定義されていましたが、 それは設計ミスであることが判明しました。 レイヤーからのオフセットは無意味で信頼性がありません。 たとえば、Transformウィジェットは同じレイヤーに描画されます 変換行列が単純な変換の場合はオフセットを使用します。 または専用のボタンを押しますTransformLayer行列が自明でない場合。 前者の場合は、以前の座標原点が保持されます。 (たとえば、アプリの左上隅)、 一方、後者の場合は位置の原点を移動します。 新しいレイヤー上にあります。 2 つのケースでは、目立った結果が得られない可能性があります 追加のレイヤーは単なるスケールである可能性があるため、視覚的な違いがあります。 注釈検索では異なる結果が返されるにもかかわらず、99% です。 このローカル位置を信頼できるものにするために、次のことを選択する必要があります。 こだわりたい結果の一つ。

変更内容の説明

localPositionによって返されましたAnnotatedRegionLayer受信したローカル位置から減算された値になります。offset、 どこoffsetクリッピング領域の相対的な位置です レイヤーに。

class AnnotatedRegionLayer<T> extends ContainerLayer {
  @override
  bool findAnnotations<S>(AnnotationResult<S> result, Offset localPosition, { required bool onlyFirst }) {
    ...
    if (/* shouldAddAnnotation */) {
      result.add(AnnotationEntry<S>(
        annotation: typedValue,
        // Used to be:
        // localPosition: localPosition,
        localPosition: localPosition - offset,
      ));
    }
    ...
  }
}

概念的には、これにより方法が変わりましたAnnotatedRegionLayer.offsetsizeが定義されています。それらはかつて意味していました 「注釈の検索を制限するクリッピング四角形」、 彼らは現在共同代表を務めていますが、 「注釈オブジェクトの領域」。

移行ガイド

このローカル位置を積極的に使用しているコードはおそらく次のとおりです。 レンダーオブジェクトを使用するため、レイヤーと直接対話するか、 ウィジェットにより、この結果はすでに信頼性が低くなります。そうするには 以前の動作を保存すると、再実装できますAnnotatedRegionLayerなしでローカル位置を返す オフセットを減算します。

タイムライン

リリースされたバージョン: 1.15.2
安定版リリース: 1.17

参考文献

API ドキュメント:

  • AnnotatedRegionLayer
  • AnnotationEntry

関連する問題:

  • 問題 #49568

関連する PR:

  • Annotation の localPosition をオブジェクトに対して相対的にする
78226918-512e-4854-b0bc-7689cfbf1bb